package com.example.taskscheduling_quartz.config;

import com.example.taskscheduling_quartz.task.MyTask;
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Quartz定时任务配置类
 * 用于定义Quartz的JobDetail（任务详情）和Trigger（触发器）
 * 将任务与触发规则关联，交给Quartz调度器管理
 */
@Configuration // 标识为Spring配置类，用于定义Bean
public class QuartzConfig {

    /**
     * 定义任务详情（JobDetail）
     * JobDetail用于描述任务的元数据信息，包括任务实现类、标识等
     *
     * @return JobDetail对象，包含MyTask任务的配置信息
     */
    @Bean
    public JobDetail jobDetail() {
        // 使用JobBuilder构建JobDetail
        return JobBuilder.newJob(MyTask.class) // 指定任务实现类（MyTask）
                .withIdentity("myTask") // 设置任务唯一标识（名称）
                .storeDurably() // 设置任务为持久化（即使没有触发器关联也会保留）
                .build(); // 构建JobDetail对象
    }

    /**
     * 定义触发器（Trigger）
     * 触发器用于指定任务的执行规则（何时执行、执行频率等）
     * 此处使用CronTrigger，支持通过cron表达式定义复杂的执行规则
     *
     * @return Trigger对象，包含MyTask任务的触发规则
     */
    @Bean
    public Trigger myTaskTrigger() {
        // 定义Cron调度规则：每秒执行一次（cron表达式"* * * * * ?"）
        CronScheduleBuilder schedule = CronScheduleBuilder.cronSchedule("* * * * * ?");

        // 使用TriggerBuilder构建触发器
        return TriggerBuilder.newTrigger()
                .forJob(jobDetail()) // 关联到前面定义的JobDetail（myTask任务）
                .withIdentity("MyTaskTrigger") // 设置触发器唯一标识（名称）
                .withSchedule(schedule) // 应用前面定义的Cron调度规则
                .build(); // 构建Trigger对象
    }
}